/**
 * Map 是一种新的集合类型，为这门语言带来了真正的键/值存储机制。
 * 6.4.1 基本API
 *  初始化：1.new Map()一个空的map
 *          2.如果想要初始化一个有值的map
 *              可以给map传入一个可迭代的对象，需要包含键值对数组
 *              （1）使用嵌套数组传入
 *              new Map([["1",1],["2",2]])
 *              (2)使用自定义迭代器初始化映射
 *              new Map({
 *              [Symbol:iterator]:function*(){
 *                 yield ["key1","val1"],
 *                  yield ["key2","val2"]
 *              }})    
 *  使用set()方法添加
 *  get() 和 has()进行查询
 *  size()获得键值对数量
 *  delete()删除
 *  clear() 清空
 * 6.4.2 顺序与迭代
 *  Map实例会维护键值对的插入顺序，可根据插入顺序执行迭代操作。
 *  1、提供了一个entries()方法或者  Symbol.iterator属性
 *  2、使用forEach(callback, opt_thisArg)第一个回调函数，第二个传入this用于重写回调内部的this
 *  3、使用keys()和values()分别返回按插入顺序生成键和值的迭代器，键和值在迭代器遍历时是可以修改的，但映射内部的引用则无法修改。
 * 6.4.3 Object和Map的差别
 *  1.Map占用内存少，同样的属性Map占用的属性是Object的50%
 *  2.Map插入数据稍微快一点，对于这两个类型来说，插入速度不会随着数量的增加而线性增加。如果有大量插入使用Map更佳。
 *  3.查询速度差距不大，如果数据量少Object更快，如果涉及大量查找，使用Object
 *  4.Map的delete()操作更快，如果涉及大量删除使用Map
 */
const m = new Map([
    ["key1", "val1"], 
    ["key2", "val2"], 
    ["key3", "val3"] 
])
for (let value of m.entries()) { 
    console.log(value[1])
}
for (let value of m [Symbol.iterator]()) { 
    console.log(value[1])
}
m.forEach((value,key) => { 
    console.log(value)
    console.log(key)
})